using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using ClickSocial.Framework;
using ClickSocial.Data;
using ClickSocial.Entities;
using System.Web;
using System.Web.Security;
using System.Web.Profile;

namespace ClickSocial.Components
{
    public class Ventas
    {
        #region Singleton
        static VentaDal _instance;
        public Ventas()
        {

        }
        public static VentaDal Instance()
        {
            if (_instance == null)
            {
                if (HttpContext.Current == null)
                    _instance = new VentaDal();
                else
                {
                    VentaDal inst = HttpContext.Current.Items["VentaDalSingleton"] as VentaDal;
                    if (inst == null)
                    {
                        inst = new VentaDal();
                        HttpContext.Current.Items.Add("VentaDalSingleton", inst);
                    }
                    return inst;
                }
            }
            return _instance;
        } 
        #endregion

        #region List     

        static public VentaInfo GetOne(long id, string cliente)
        {
            VentaInfo venta_info = null;
            try
            {
                venta_info = CBO.FillObject<VentaInfo>(Instance().GetOne(id, cliente));
            }
            catch (Exception ex)
            {
                Hashtable addInfo = new Hashtable();
                addInfo.Add("id", id.ToString());

                throw ExceptionManager.Handle(ex, "Error al recuperar una venta", addInfo);
            }
            return venta_info;
        }

        static public VentaInfo GetOne(long id)
        {
            VentaInfo venta_info = null;
            try
            {
                venta_info = CBO.FillObject<VentaInfo>(Instance().GetOne(id));
            }
            catch (Exception ex)
            {
                Hashtable addInfo = new Hashtable();
                addInfo.Add("id", id.ToString());

                throw ExceptionManager.Handle(ex, "Error al recuperar una venta", addInfo);
            }
            return venta_info;
        }

        static public List<VentaInfo> GetAll()
        {
            List<VentaInfo> lst_venta_info = new List<VentaInfo>();

            try
            {
                lst_venta_info = CBO.FillCollection<VentaInfo>(Instance().GetAll());
            }
            catch (Exception ex)
            {
                throw ExceptionManager.Handle(ex, "Error al recuperar ventas");
            }

            return lst_venta_info;
        }

        static public List<VentaInfo> GetAllByFotografo(string fotografo)
        {
            List<VentaInfo> lst_venta_info = new List<VentaInfo>();

            try
            {
                lst_venta_info = CBO.FillCollection<VentaInfo>(Instance().GetAllByFotografo(fotografo));
            }
            catch (Exception ex)
            {
                throw ExceptionManager.Handle(ex, "Error al recuperar ventas por fotografo");
            }

            return lst_venta_info;
        }

        static public List<VentaInfo> GetAllByCliente(string cliente)
        {
            List<VentaInfo> lst_venta_info = new List<VentaInfo>();

            try
            {
                lst_venta_info = CBO.FillCollection<VentaInfo>(Instance().GetAllByCliente(cliente));
            }
            catch (Exception ex)
            {
                throw ExceptionManager.Handle(ex, "Error al recuperar ventas por cliente");
            }

            return lst_venta_info;
        }

        static public List<VentaInfo> BuscarVentas(DateTime? desde, DateTime? hasta, string estado, string campoBusqueda, string textoBusqueda, string userFotografo)
        {
            List<VentaInfo> lst_venta_info = new List<VentaInfo>();

            try
            {
                textoBusqueda = (campoBusqueda == string.Empty ? string.Empty : textoBusqueda);
                campoBusqueda = (textoBusqueda == string.Empty ? string.Empty : campoBusqueda);

                if (campoBusqueda == "Fotografo")
                {
                    foreach (string user in Roles.GetUsersInRole("Fotografo"))
                    {
                        PerfilComun p = ProfileBase.Create(user) as PerfilComun;

                        if (p.Nombre.ToLower().IndexOf(textoBusqueda) != -1 || p.Apellido.ToLower().IndexOf(textoBusqueda) != -1 || user.ToLower().IndexOf(textoBusqueda) != -1)
                        {
                            userFotografo = user;
                            campoBusqueda = string.Empty;
                            textoBusqueda = string.Empty;
                            break;
                        }
                    }
                    if (userFotografo == string.Empty)
                    {
                        return lst_venta_info;
                    }
                }
                

                lst_venta_info = CBO.FillCollection<VentaInfo>(Instance().BuscarVentas(desde, hasta, estado, campoBusqueda, textoBusqueda, userFotografo));
                
            }
            catch (Exception ex)
            {
                Hashtable addInfo = new Hashtable();
                addInfo.Add("Desde", desde.ToString());
                addInfo.Add("Hasta", hasta.ToString());
                addInfo.Add("Estado", estado);
                addInfo.Add("CampoBusqueda", campoBusqueda);
                addInfo.Add("TextoBusqueda", textoBusqueda);
                addInfo.Add("UserFotografo", userFotografo);

                throw ExceptionManager.Handle(ex, "Error al recuperar ventas en una busqueda.", addInfo);
            }
            
            return lst_venta_info;
        }

        #endregion

        #region CRUD
        static public VentaInfo Insert(VentaInfo oVentaInfo)
        {
            
            try
            {
                long id = Instance().Insert(oVentaInfo.Cliente, oVentaInfo.Monto, oVentaInfo.Fecha, oVentaInfo.Estado, oVentaInfo.Cantidad);
                return GetOne(id);
            }
            catch (Exception ex)
            {
                Hashtable addInfo = new Hashtable();
                addInfo.Add("Cliente", oVentaInfo.Cliente);
                addInfo.Add("Monto", oVentaInfo.Monto.ToString());
                addInfo.Add("Fecha", oVentaInfo.Fecha.ToString());
                addInfo.Add("Estado", oVentaInfo.Estado);
                addInfo.Add("Cantidad", oVentaInfo.Cantidad.ToString());

                throw ExceptionManager.Handle(ex, "Error al registrar una nueva venta.", addInfo);
            }

            
        }
        static public void Delete(long id)
        {
            try
            {
                Instance().Delete(id);
            }
            catch (Exception ex)
            {
                Hashtable addInfo = new Hashtable();
                addInfo.Add("VentaID", id.ToString());

                throw ExceptionManager.Handle(ex, "Error al eliminar una venta.", addInfo);
            }
        }
        static public void DeleteByFotografo(long id, string fotografo)
        {
            try
            {
                Instance().Delete(id, fotografo);
            }
            catch (Exception ex)
            {
                Hashtable addInfo = new Hashtable();
                addInfo.Add("VentaID", id.ToString());
                addInfo.Add("UserFotografo", fotografo);

                throw ExceptionManager.Handle(ex, "Error al eliminar una venta.", addInfo);
            }
        }
        static public void Update(VentaInfo oVentaInfo)
        {
            try
            {
                Instance().Update(oVentaInfo.VentaID, oVentaInfo.Cliente, oVentaInfo.Monto, oVentaInfo.Fecha, oVentaInfo.Estado, oVentaInfo.Cantidad);
            }
            catch (Exception ex)
            {
                Hashtable addInfo = new Hashtable();
                addInfo.Add("VentaID", oVentaInfo.VentaID.ToString());
                addInfo.Add("Cliente", oVentaInfo.Cliente);
                addInfo.Add("Monto", oVentaInfo.Monto.ToString());
                addInfo.Add("Fecha", oVentaInfo.Fecha.ToString());
                addInfo.Add("Estado", oVentaInfo.Estado);
                addInfo.Add("Cantidad", oVentaInfo.Cantidad.ToString());
                
                throw ExceptionManager.Handle(ex, "Error al editar una venta.", addInfo);
            }
        }
        static public void UpdateEstado(long ventaId, string estado)
        {
            try
            {
                Instance().UpdateEstado(ventaId, estado);
            }
            catch (Exception ex)
            {
                Hashtable addInfo = new Hashtable();
                addInfo.Add("VentaID", ventaId.ToString());
                addInfo.Add("Estado", estado);

                throw ExceptionManager.Handle(ex, "Error el estado de una venta.", addInfo);
            }
        }
        #endregion

    }
}
